using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public AgendaxusuarioVO getAgendaxusuario(int? idAgendaXUsuario)
		{
			AgendaxusuarioVO agendaxusuarioVO = null;
			List<AgendaxusuarioVO> listAgendaxusuarioVOs = getAgendaxusuarios(idAgendaXUsuario, null, null, null, null, null, null);
			if (listAgendaxusuarioVOs != null && listAgendaxusuarioVOs.Count > 0)
			{
				agendaxusuarioVO = listAgendaxusuarioVOs[0];
			}
			return agendaxusuarioVO;
		}

		public List<AgendaxusuarioVO> getAgendaxusuarios()
		{
			return getAgendaxusuarios(null, null, null, null, null, null, null);
		}

		public List<AgendaxusuarioVO> getAgendaxusuarios(int? idAgendaXUsuario)
		{
			return getAgendaxusuarios(idAgendaXUsuario, null, null, null, null, null, null);
		}

		public List<AgendaxusuarioVO> getAgendaxusuarios(int? idAgendaXUsuario, int? idAgenda, int? idUsuário, int? idAgendaTipo, bool? avisar, bool? email, string especie)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT axu.idAgendaXUsuario as axu_idAgendaXUsuario, axu.idAgenda as axu_idAgenda, agd.assunto as agd_assunto, axu.idUsuário as axu_idUsuário, axu.avisar as axu_avisar, axu.email as axu_email, axu.especie as axu_especie, axu.idAgendaTipo as axu_idAgendaTipo, agt.agendaTipo as agt_agendaTipo, axu.cadastro as axu_cadastro, axu.cadastradoPor as axu_cadastradoPor, axu.edicao as axu_edicao, axu.editadoPor as axu_editadoPor  ");
			query.AppendLine("FROM agendaxusuario as axu LEFT OUTER JOIN agenda as agd on axu.idAgenda=agd.idAgenda  LEFT OUTER JOIN usuario as usu on axu.idUsuário=usu.idUsuario  LEFT OUTER JOIN agendatipo as agt on axu.idAgendaTipo=agt.idAgendaTipo  ");
			if (idAgendaXUsuario != null)
			{
				query.AppendLine(where + "axu.idAgendaXUsuario=@idAgendaXUsuario ");
				where = "AND ";
			}
			if (idAgenda != null)
			{
				query.AppendLine(where + "axu.idAgenda=@idAgenda ");
				where = "AND ";
			}
			if (idUsuário != null)
			{
				query.AppendLine(where + "axu.idUsuário=@idUsuário ");
				where = "AND ";
			}
			if (avisar != null)
			{
				query.AppendLine(where + "axu.avisar=@avisar ");
				where = "AND ";
			}
			if (email != null)
			{
				query.AppendLine(where + "axu.email=@email ");
				where = "AND ";
			}
			if (especie != null)
			{
				query.AppendLine(where + "axu.especie=@especie ");
				where = "AND ";
			}
			if (idAgendaTipo != null)
			{
				query.AppendLine(where + "axu.idAgendaTipo=@idAgendaTipo ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY axu.idAgendaXUsuario ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idAgendaXUsuario!= null) cmd.Parameters.Add(getParameter(cmd, "@idAgendaXUsuario", idAgendaXUsuario));
			if (idAgenda!= null) cmd.Parameters.Add(getParameter(cmd, "@idAgenda", idAgenda));
			if (idUsuário!= null) cmd.Parameters.Add(getParameter(cmd, "@idUsuário", idUsuário));
			if (avisar!= null) cmd.Parameters.Add(getParameter(cmd, "@avisar", avisar.Value?"S":"N"));
			if (email!= null) cmd.Parameters.Add(getParameter(cmd, "@email", email.Value?"S":"N"));
			if (especie!= null) cmd.Parameters.Add(getParameter(cmd, "@especie", especie));
			if (idAgendaTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idAgendaTipo", idAgendaTipo));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<AgendaxusuarioVO> listAgendaxusuario = new List<AgendaxusuarioVO>();

				while (reader.Read())
				{
					AgendaxusuarioVO agendaxusuarioVO = AgendaxusuarioVO.CreateVO();
					agendaxusuarioVO.idAgendaXUsuario = reader.GetInt32(reader.GetOrdinal("axu_idAgendaXUsuario"));
					agendaxusuarioVO.idAgenda = reader.GetInt32(reader.GetOrdinal("axu_idAgenda"));
					if (!reader.IsDBNull(reader.GetOrdinal("agd_assunto")))
						agendaxusuarioVO.idAgendaVO.assunto = reader.GetString(reader.GetOrdinal("agd_assunto"));
					agendaxusuarioVO.idUsuário = reader.GetInt32(reader.GetOrdinal("axu_idUsuário"));
					agendaxusuarioVO.avisar = reader.GetString(reader.GetOrdinal("axu_avisar")).Equals("S");
					agendaxusuarioVO.email = reader.GetString(reader.GetOrdinal("axu_email")).Equals("S");
					if (!reader.IsDBNull(reader.GetOrdinal("axu_especie")))
						agendaxusuarioVO.especie = reader.GetString(reader.GetOrdinal("axu_especie"));
					if (!reader.IsDBNull(reader.GetOrdinal("axu_idAgendaTipo")))
						agendaxusuarioVO.idAgendaTipo = reader.GetInt32(reader.GetOrdinal("axu_idAgendaTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("agt_agendaTipo")))
						agendaxusuarioVO.idAgendaTipoVO.agendaTipo = reader.GetString(reader.GetOrdinal("agt_agendaTipo"));
					agendaxusuarioVO.cadastro = reader.GetDateTime(reader.GetOrdinal("axu_cadastro"));
					agendaxusuarioVO.cadastradoPor = reader.GetString(reader.GetOrdinal("axu_cadastradoPor"));
					agendaxusuarioVO.edicao = reader.GetDateTime(reader.GetOrdinal("axu_edicao"));
					agendaxusuarioVO.editadoPor = reader.GetString(reader.GetOrdinal("axu_editadoPor"));


					listAgendaxusuario.Add(agendaxusuarioVO);
				}
				reader.Close();
				return listAgendaxusuario;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setAgendaxusuario(AgendaxusuarioVO agendaxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE agendaxusuario ");
			query.AppendLine("SET idAgenda=@idAgenda, idUsuário=@idUsuário, avisar=@avisar, email=@email, especie=@especie, idAgendaTipo=@idAgendaTipo,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idAgendaXUsuario=@idAgendaXUsuario ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idAgendaXUsuario", agendaxusuarioVO.idAgendaXUsuario));
			cmd.Parameters.Add(getParameter(cmd, "@idAgenda", agendaxusuarioVO.idAgenda));
			cmd.Parameters.Add(getParameter(cmd, "@idUsuário", agendaxusuarioVO.idUsuário));
			cmd.Parameters.Add(getParameter(cmd, "@avisar", (agendaxusuarioVO.avisar==null?" ":(agendaxusuarioVO.avisar.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@email", (agendaxusuarioVO.email==null?" ":(agendaxusuarioVO.email.Value?"S":"N"))));
			if (agendaxusuarioVO.especie == null)
				cmd.Parameters.Add(getParameter(cmd, "@especie", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@especie", agendaxusuarioVO.especie));
			if (agendaxusuarioVO.idAgendaTipo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idAgendaTipo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idAgendaTipo", agendaxusuarioVO.idAgendaTipo));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", agendaxusuarioVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", agendaxusuarioVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", agendaxusuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", agendaxusuarioVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newAgendaxusuario(AgendaxusuarioVO agendaxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO agendaxusuario ");
			query.AppendLine("  ( idAgenda, idUsuário, avisar, email, especie, idAgendaTipo, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idAgenda, @idUsuário, @avisar, @email, @especie, @idAgendaTipo, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idAgenda", agendaxusuarioVO.idAgenda));
			cmd.Parameters.Add(getParameter(cmd, "@idUsuário", agendaxusuarioVO.idUsuário));
			cmd.Parameters.Add(getParameter(cmd, "@avisar", (agendaxusuarioVO.avisar==null?" ":(agendaxusuarioVO.avisar.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@email", (agendaxusuarioVO.email==null?" ":(agendaxusuarioVO.email.Value?"S":"N"))));
			if (agendaxusuarioVO.especie == null)
				cmd.Parameters.Add(getParameter(cmd, "@especie", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@especie", agendaxusuarioVO.especie));
			if (agendaxusuarioVO.idAgendaTipo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idAgendaTipo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idAgendaTipo", agendaxusuarioVO.idAgendaTipo));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", agendaxusuarioVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", agendaxusuarioVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", agendaxusuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", agendaxusuarioVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('agendaxusuario') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delAgendaxusuario(AgendaxusuarioVO agendaxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM agendaxusuario ");
			query.AppendLine("WHERE idAgendaXUsuario=@idAgendaXUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idAgendaXUsuario", agendaxusuarioVO.idAgendaXUsuario));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountAgendaxusuarioxIdAgenda(int? idAgenda)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idAgenda) as ocorrencias FROM agendaxusuario WHERE IdAgenda=@IdAgenda ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdAgenda", idAgenda));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountAgendaxusuarioxIdUsuário(int? idUsuário)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idUsuário) as ocorrencias FROM agendaxusuario WHERE IdUsuário=@IdUsuário ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdUsuário", idUsuário));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountAgendaxusuarioxIdAgendaTipo(int? idAgendaTipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idAgendaTipo) as ocorrencias FROM agendaxusuario WHERE IdAgendaTipo=@IdAgendaTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdAgendaTipo", idAgendaTipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
